<?php
/**
 * 数据库表
 */
abstract class table extends obj
{
    protected $table_name = '';
    protected $table_key = '';

    /**
     * 构造函数
     * @param string $table_name 表名
     * @param string $table_key	主键名
     */
    public function __construct($table_name, $table_key = 'id')
    {
        $this->table_name = $table_name;
        $this->table_key = $table_key;
    }

    /**
     * 
     * 绑定一个数据源， GET, POST, 或者一个数组, 对象 
     * @param object $data 要绑定到表的数据 也可以是数组
     */
    public function bind($data)
    {
        if (!is_object($data) && !is_array($data))
        {
            $this->set_error('参数错误, 绑定数据源必须为对象或数组');
            return false;
        }
        
        if (is_object($data)) $data = get_object_vars($data);
        
        $properties = get_object_vars($this);
        
        foreach ($properties as $key => $value)
        {
            if (isset($data[$key]))
            {
                $val = $data[$key];
                $this->$key = $val;
            }
        }
        
        return true;
    }

    /**
     * 
     * 加载记录
     * @param int $id 按指定的主键值加载
     * @return bool
     */
    public function load($id = null)
    {
        $table_key = $this->table_key;
        if ($id === null) $id = $this->$table_key;
        
        if ($id === null)
        {
            $this->set_error('参数错误, 请指定要加载记录的编号');
            return false;
        }
        
        $db = bone::get_db();
        $row = $db->get_obj('SELECT * FROM `' . $this->table_name . '` WHERE `' . $this->table_key . '` = \'' . $id . '\'');
        
        $error = $db->get_error();
        if ($error !== null)
        {
            $this->set_error($error);
            return false;
        }
        
        if (empty($row))
        {
            $this->set_error('不存在指定编号的记录');
            return false;
        }
        
        return $this->bind($row);
    }

    /**
     * 
     * 按指定的条件加载记录 $value==null 时， $key 可以是 SQL 条件语句
     * 
     * @param string $key 按指定的列名或SQL条件
     * @param string $value 指定列名的值
     * @return bool
     */
    public function load_by($key, $value = null)
    {
        $db = bone::get_db();
        if ($value)
        {
            $row = $db->get_obj('SELECT * FROM `' . $this->table_name . '` WHERE `' . $key . '` = \'' . $value . '\'');
        }
        else
        {
            $row = $db->get_obj('SELECT * FROM `' . $this->table_name . '` WHERE ' . $key);
        }
        
        $error = $db->get_error();
        if ($error !== null)
        {
            $this->set_error($error);
            return false;
        }
        
        if (empty($row))
        {
            $this->set_error('不存在指定编号的记录');
            return false;
        }
        
        return $this->bind($row);
    }

    /**
     * 
     * 保存数据到数据库 
     * @param bool $update_null 是否更新空记录
     * @return bool
     */
    public function save($update_null = false)
    {
        if (!$this->check()) return false;
        
        $db = bone::get_db();
        
        $table_key = $this->table_key;
        if ($this->$table_key)
        {
            $stored = $db->update($this->table_name, $this, $this->table_key, $update_null);
        }
        else
        {
            $stored = $db->insert($this->table_name, $this);
            
            $table_key = $this->table_key;
            $this->$table_key = $db->get_insert_id();
        }
        
        if (!$stored)
        {
            $this->set_error($db->get_error());
            return false;
        }
        
        return true;
    }

    /**
     * 
     * 删除指定主键值的记录
     * @param int $id 主键值
     * @return bool
     */
    public function delete($id = null)
    {
        $table_key = $this->table_key;
        if ($id === null) $id = $this->$table_key;
        
        if ($id === null)
        {
            $this->set_error('参数错误, 请指定要删除记录的编号');
            return false;
        }
        
        $db = bone::get_db();
        if ($db->execute('DELETE FROM `' . $this->table_name . '` WHERE `' . $this->table_key . '`=' . $id))
        {
            $this->set_error($db->get_error());
            return false;
        }
        
        return true;
    }

    /**
     * 
     * 检查数据是否舍法， 子类须重写本方法。 检查提交的数据。
     * 
     * @return bool
     */
    public function check()
    {
        return true;
    }

}